﻿//VolatilityQuotingStrategy.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Strategies
{
	using Ecng.ComponentModel;

	using StockSharp.Algo.Derivatives;
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Котирование опционов по волатильности.
	/// </summary>
	public class VolatilityQuotingStrategy : BestByPriceQuotingStrategy
	{
		private BlackScholes _bs;

		/// <summary>
		/// Создать <see cref="VolatilityQuotingStrategy"/>.
		/// </summary>
		/// <param name="quotingDirection">Направление котирования.</param>
		/// <param name="quotingVolume">Объем, который необходимо скотировать.</param>
		/// <param name="ivRange">Границы волатильности.</param>
		public VolatilityQuotingStrategy(OrderDirections quotingDirection, decimal quotingVolume, Range<decimal> ivRange)
			: base(quotingDirection, quotingVolume)
		{
			_ivRange = this.Param("IVRange", ivRange);
		}

		private readonly StrategyParam<Range<decimal>> _ivRange;

		/// <summary>
		/// Границы волатильности.
		/// </summary>
		public Range<decimal> IVRange
		{
			get { return _ivRange.Value; }
			set { _ivRange.Value = value; }
		}

		/// <summary>
		/// Инструмент.
		/// </summary>
		public override Security Security
		{
			set
			{
				_bs = new BlackScholes(value);
				base.Security = value;
			}
		}

		/// <summary>
		/// Получить приемлемый диапазон цены, попадая в который текущая заявка не будет перерегистрирована.
		/// </summary>
		/// <returns>Приемлемый диапазон цены. Если невозможно вычислить диапазон на данный момент, то будет возвращено null.</returns>
		protected override Range<decimal> GetAcceptablePriceRange()
		{
			var minPrice = _bs.Premium(IVRange.Min / 100);
			var maxPrice = _bs.Premium(IVRange.Max / 100);

			return new Range<decimal>(minPrice, maxPrice);
		}
	}
}